package com.ht.api.bigtask;

import javax.sql.DataSource;

import com.ht.api.constant.CacheConstants;
import com.ht.api.db.DbConfig;
import com.ht.api.db.Entity;
import com.ht.api.db.StreamLoadConfig;
import com.ht.api.db.util.RedisUtil;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 大任务：应用初始化基类
 * @author asq
 * @createTime 2025年1月15日 09:21:41
 */
@Slf4j
public abstract class BaseBigTask extends BigTask {
	/** 页码的变量名 */
	protected static final String PAGE_NUM_NAME = "page_num";

	/**
	 * 获取接口配置
	 * @param apiId 接口ID
	 * @return
	 */
	protected JSONObject getApiConfig(long apiId) {
		Entity entity = RedisUtil.get(CacheConstants.KEY_API + apiId);
		return JSONUtil.parseObj(entity.getStr("config"));
	}

	/**
	 * 根据接口返回数据，创建一个要插入open_data表的Entity
	 * @param appId        应用ID
	 * @param entity 接口返回的json数据
	 * @return
	 */
	protected Entity createOpenDataEntity(String appId, long apiId, JSONObject bean) {
		bean.set("appid", appId);
		bean.set("isinit", 1);
		return Entity.create("open_data").set("source_code", apiId + "").set("data", JSONUtil.toJsonStr(bean));
	}

	/**
	 * 返回应用的所属租户库数据源
	 * @param appId
	 * @return
	 */
	protected DataSource getTenantDs(String appId) {
		Entity entity = RedisUtil.get(CacheConstants.KEY_APP + appId);
		return DbConfig.tenantDSMap.get(entity.getLong("tenant_id"));
	}

	/**
	 * 返回应用的所属租户库数据源
	 * @param appId
	 * @return
	 */
	protected StreamLoadConfig getTenantStreamConfig(String appId) {
		Entity entity = RedisUtil.get(CacheConstants.KEY_APP + appId);
		return DbConfig.tenantStreamLoadConfigMap.get(entity.getLong("tenant_id"));
	}
	
	/**
	 * 恢复进度
	 * @return
	 */
	protected int getPageNum() {
		JSONObject info = getInfo();
		if (info.containsKey(PAGE_NUM_NAME)) {
			Integer value = info.getInt(PAGE_NUM_NAME);
			log.info("[BaseQywxTask]获取到上次执行进度，将继续执行，{}:{}", PAGE_NUM_NAME, value);
			return value;
		} else {
			log.info("[BaseQywxTask]未获取到上次执行进度，将从头开始执行。");
			return 0;
		}
	}
}
